package ws

import (
	"sync"

	"github.com/gorilla/websocket"
)

type Ws链接_广播 struct {
	链接表列 map[string][]*websocket.Conn
	锁列表 map[string][]*sync.RWMutex
	读写许可 *sync.RWMutex
}

func (类 *Ws链接_广播) C初始化() {
	类.链接表列 = make(map[string][]*websocket.Conn)
	类.锁列表=make(map[string][]*sync.RWMutex)
	var 锁 sync.RWMutex
	类.读写许可 = &锁
}

func (类 *Ws链接_广播) Z增加链接(方法名 string, 链接 *websocket.Conn) {
	类.读写许可.Lock()
	defer 类.读写许可.Unlock()
	if 用户列表, ok := 类.链接表列[方法名]; ok {
		for _, v := range 用户列表 {
			if v == 链接 {
				return
			}
		}
		用户列表 = append(用户列表, 链接)
		类.链接表列[方法名] = 用户列表
		锁列表:=类.锁列表[方法名]
		var 锁 sync.RWMutex
		锁列表=append(锁列表, &锁)
		类.锁列表[方法名]=锁列表

	} else {
		var 用户列表 = make([]*websocket.Conn, 1)
		用户列表[0] = 链接
		类.链接表列[方法名] = 用户列表

		var 锁列表 = make([]*sync.RWMutex, 1)
		var 锁 sync.RWMutex
		锁列表[0]=&锁
		类.锁列表[方法名]=锁列表
	}
}

func (类 *Ws链接_广播) S删链接(方法名 string, 链接 *websocket.Conn) {
	类.读写许可.Lock()
	defer 类.读写许可.Unlock()
	if 用户列表, ok := 类.链接表列[方法名]; ok {
		for i, v := range 用户列表 {
			if v == 链接 {
				用户列表 = append(用户列表[:i], 用户列表[i+1:]...)
				类.链接表列[方法名] = 用户列表

				锁表:=类.锁列表[方法名]
				锁表 = append(锁表[:i], 锁表[i+1:]...)
				类.锁列表[方法名]=锁表
				return
			}
		}
	}

}

func (类 *Ws链接_广播) T推送消息_文本(方法名 string, 消息 string) {
	类.读写许可.RLock()
	defer 类.读写许可.RUnlock()
	if 用户列表, ok := 类.链接表列[方法名]; ok {
		for i, v := range 用户列表 {
			锁:=类.锁列表[方法名][i]
			go 推送消息(v,锁,消息)
			//go v.WriteMessage(websocket.TextMessage, []byte(消息))

		}
	}

}

func (类 *Ws链接_广播) T推送消息_方法推文本(方法名 string, 消息方法 func() string) {
	类.读写许可.RLock()
	defer 类.读写许可.RUnlock()
	发送消息 := 消息方法()
	if 用户列表, ok := 类.链接表列[方法名]; ok {
		for i, v := range 用户列表 {
			锁:=类.锁列表[方法名][i]
			go 推送消息(v,锁,发送消息)
			//go v.WriteMessage(websocket.TextMessage, []byte(发送消息))

		}
	}

}
